Google HomeからEC2インスタンスを停止させてみる #GoogleHome
どうも!大阪オフィスの西村祐二です。
とうとう私の家に音声認識デバイスの「Google Home」が来ました! ということでIFTTTとAPI GatewayとLambdaをつかって Google HomeからEC2インスタンスを停止させてみたいと思います。
概要
Google Homeの音声認識部分は「Google Assistant」が担っております。 IFTTTというサービスはその「Google Assistant」をトリガーに設定することができ、 さらに、Webhookも利用できるので、
Google Home ↓ IFTTT ↓ API Gateway ↓ Lambda というようにGoogle HomeからLambda関数を実行することができます。
この仕組みを利用して、Google HomeからEC2インスタンスを停止させてみたいと思います。
構成図
事前準備
- EC2インスタンスを1台たてておいてください。
- IFTTTのアカウントを作成しておいてください。
手順
- インスタンスを停止するLambda関数の作成
- API GatewayでAPIの作成
- IFTTTでAppletの作成
では、さっそくやっていきましょう!
インスタンスを停止するLambda関数の作成
プログラムをのせていますがサンプルとしてのLambda関数なのでご利用は自己責任でお願い致します。
マネージメントコンソールから作成していきます。
▼「関数の作成」をクリックします。
▼「一から作成」をクリックします。
▼Lambda関数の設定を行います。
- 名前:instance-stop
- ロール:カスタムロールの作成(インスタンス停止の権限付与)
- ロール名:lambda_instance_stop
今回、ロールは専用のものを作成しました。 既存のものでも構いませんが、EC2インスタンスを停止する権限が必要となります。
▼「関数の作成」をクリックします。
▼関数コードを設定します。
- ランタイム:Python3.6
下記サンプルプログラムをコピペしてください。
INSTANCE_ID
には事前に用意したインスタンスIDを設定してください。
Lambdaに渡ってきたeventの中に「stop」があるときにインスタンスの停止を行うようにしています。
import boto3 INSTANCE_ID = 'i-xxxxxxxxxxxxxxx' ec2 = boto3.resource('ec2') ec2instance = ec2.Instance(INSTANCE_ID) p def handler(event, context): if event['operation'] == 'stop': ec2instance.stop() print('Instance Stop!') else: return('Error End')
▼動作確認をします。
※事前に用意したEC2インスタンスを起動しておいてください。
「保存してテスト」をクリックし、テストイベントを設定します。 テストイベントの設定が完了したら、保存してテストします。 うまくいけば設定したインスタンスが停止するはずです。
- イベント名:test
{ "operation": "stop" }
動作確認で問題なければ、Lambda関数の作成は終わりです。
APIの作成
API GatewayでLambdaをキックするためのAPIを作成します。 マネージメントコンソールから作成していきます。
▼「APIの作成」をクリックします。
▼作成するAPIの名前を設定し「APIの作成」をクリックします。
- API名:instance-stop
▼リソースのアクションから「メソッドの作成」をクリックし、「POST」を設定します。
▼POSTのセットアップを行い「保存」をクリックします。
- 統合タイプ:Lambda関数
- Lambdaリージョン:ap-northeast-1
- Lambda関数:instace-stop
▼「APIのデプロイ」をクリックします。
▼デプロイするステージを設定し、「デプロイ」をクリックします。
- ステージ名:test
▼作成したAPIのURLを確認します。
IFTTTにて使用しますので、URLをメモしておいてください。
IFTTTでAppletの作成
IFTTTにアクセスし、ログインします。
▼「MyApplets」をクリックします。
▼トリガーにする「Google Assistant」を検索し、クリックします。
▼「Connect」をクリックし、Google Homeに設定しているアカウントと紐付けます。
▼「Say a simple phrase」をクリックします。
▼OK、Googleの後のフレーズやGoogle Homeからの返答を設定し、「Create tregger」をクリックします。
▼トリガー発動時のアクションとして「webhooks」の設定を行います。
▼「Make a web request」をクリックします。
▼API Gatewayで作成したAPIのURLやLambdaに渡すBodyの設定など行い、「Create action」をクリックします。
- URL:メモしたURL
- Method:POST
- Content Type:application/json
- Body:{"operation" : "stop"}
▼「Finsh」をクリックし、Appletを作成します。
▼作成したAppletを「on」しておきます。
これですべての設定が完了です!
動作確認
ちゃんと動くかなぁ。。。
設定どおりにインスタンスの停止が行われていますね! 音量小さく聞き取りづらいですが、設定した「まいど!おおきに!」もきちんと言ってくれていますね!
さいごに
いかがだったでしょうか。
IFTTTとAPI GatewayとLambdaをつかって Google HomeからEC2インスタンスを停止させてみました。 API Gateway+Lambdaで何か構築したことがある方は 簡単にできるかと思います。
日本でも音声認識デバイスが流行って欲しいです。
誰かの参考になれば幸いです。